package com.wei.czz.framework.common.service;

import com.wei.czz.common.dto.common.ChildrenNameValue;
import com.wei.czz.common.enums.common.multiDIct.MultiDictEnum;
import com.wei.czz.common.tool.PageDto;
import com.wei.czz.common.vo.common.UpdateStatusVo;
import com.wei.czz.common.vo.common.multiDict.MultiDictFormVo;
import com.wei.czz.framework.common.entity.MultiDictEntity;
import org.springframework.lang.NonNull;

import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.function.Function;

/**
 * Created by IntelliJ IDEA.
 *
 * @author wei
 * date: 2023-12-26 11:50:17
 * className: MultiDictService
 * version: 1.0
 * description:
 */
public interface MultiDictService {

    /**
     * 保存级联字典操作
     * @param multiDict 级联字典对象
     */
    void saveOrEdit(MultiDictEntity multiDict);

    /**
     * 批量保存级联字典操作
     * @param multiDictList 级联字典对象列表
     */
    void batchSave(List<MultiDictEntity> multiDictList);

    /**
     * 分页获取级联字典操作
     * @param multiDictFormVo 参数对象
     * @return 结果
     */
    PageDto<MultiDictEntity> getPageList(MultiDictFormVo multiDictFormVo);

    /**
     * 批量获取级联字典操作
     * @param idList 主键列表
     * @return 级联字典对象列表
     */
    List<MultiDictEntity> getList(List<Long> idList);

    /**
     * 获取级联字典列表操作
     * @param type     类型
     * @param parentId 父级主键
     * @return 级联字典对象列表
     */
    List<MultiDictEntity> findList(Integer type, Long parentId);

    /**
     * 获取级联字典列表操作
     * @param multiDictEnum 级联字典枚举对象
     * @return 级联字典对象列表
     */
    List<MultiDictEntity> findList(MultiDictEnum multiDictEnum);

    /**
     * 获取子、子孙级联字典操作
     * @param parentPath 父级路径
     * @return 级联字典对象列表
     */
    List<MultiDictEntity> findChildrenList(String parentPath);

    /**
     * 获取子、子孙级联字典操作
     * @param idList 主键列表
     * @return 级联字典对象列表
     */
    List<MultiDictEntity> findChildrenList(List<Long> idList);

    /**
     * 获取子、子孙级联字典操作
     * @param multiDictEnum 级联字典枚举对象
     * @return 级联字典对象列表
     */
    List<MultiDictEntity> findChildrenList(MultiDictEnum multiDictEnum);

    /**
     * 获取级联字典树操作
     * @param type     类型
     * @param function 值映射方法对象
     * @return 级联字典树
     * @param <T> 泛型类型
     */
    <T> List<ChildrenNameValue<T>> getDictTree(Integer type, @NonNull Function<String, T> function);

    /**
     * 获取级联字典操作
     * @param id 主键
     * @return 级联字典对象
     */
    MultiDictEntity get(Long id);

    /**
     * 获取下一个排序等级操作
     * @param parentId 父级主键
     * @param type     类型
     * @return 排序等级
     */
    Integer getNextSort(Long parentId, Integer type);

    /**
     * 获取级联字典名称操作
     * @param type  类型
     * @param value 值
     * @return 级联字典名称
     */
    String getName(Integer type, String value);

    /**
     * 批量获取级联字典名称操作
     * @param type           类型
     * @param stringValueSet 字符串值集合
     * @param function       值映射方法对象
     * @return 级联字典名称映射
     * @param <T> 泛型类型
     */
    <T> Map<T, String> batchGetName(Integer type, Set<String> stringValueSet, Function<String, T> function);

    /**
     * 获取直接子字典操作
     * @param multiDictEnum 字典枚举对象
     * @param valueList     字典值列表
     * @return 级联字典对象列表
     */
    List<MultiDictEntity> findDirectChildrenList(MultiDictEnum multiDictEnum, List<String> valueList);

    /**
     * 获取第一级级联字典操作
     * @param multiDictEnum 字典枚举对象
     * @return 级联字典对象列表
     */
    List<MultiDictEntity> findOneLevelList(MultiDictEnum multiDictEnum);

    /**
     * 批量修改级联字典操作
     * @param updateList 级联字典对象列表
     */
    void batchUpdate(List<MultiDictEntity> updateList);

    /**
     * 修改级联字典状态操作
     * @param updateStatusVo 参数对象
     */
    void updateMultiDictStatus(UpdateStatusVo updateStatusVo);

    /**
     * 删除级联字典操作
     * @param idList 主键列表
     */
    void delete(List<Long> idList);

}

